RDS for Oracleのブロックサイズを調べてみた
しばたです。
同僚より質問がありRDS for Oracleのブロックサイズについて何点か調べてみたのでブログで共有したいと思います。
DB_BLOCK_SIZE パラメーター
Oracle Databaseでは各データベースファイルは「データブロック」単位で区切られ管理されます。
このブロックサイズは物理読み込みの単位となりIO性能や最大ファイルサイズに影響を及ぼします。[1]
データベース標準のブロックサイズはデータベース構築時にのみ設定可能でDB_BLOCK_SIZE
パラメーターに指定します。
私の知る限りのバージョンでDB_BLOCK_SIZE
はデフォルト値が8KB (8192)
[2]で、一度データベースを作成した後は変更できません。
非標準ブロックサイズ
Oracle 9iからDB_BLOCK_SIZE
で設定する標準ブロックサイズの他に表領域単位に個別のブロックサイズを設定できます。
この非標準のブロックサイズを使用する場合は予め各ブロックサイズに応じたキャッシュパラメーター
DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE
の設定が必要となります。
RDS for Oracleにおけるブロックサイズ
ここまでを踏まえてRDS for Oracleの設定がどうなっているか確認していきます。
検証環境
今回は私の検証AWSアカウントの東京リージョンにOracle 19c SE2の環境を作り調査します。
エンジンバージョンは本日時点で最新の19.0.0.0.ru-2022-01.rur-2022-01.r1
とし、その他必要なリソースは事前に準備済みです。
あとクライアントには使い慣れているA5:SQL Mk-2を選んでいます。
RDS for Oracle の DB_BLOCK_SIZE
RDSインスタンスの作成前に新規にパラメータグループを用意してDB_BLOCK_SIZE
の内容を確認すると下図の通りでした。
パラメーターグループ上では 値は未定義なうえに編集不可 です。
ドキュメントでもDB_BLOCK_SIZE
の値を明記しているものを見つけることができず、実際にRDSインスタンスを作ってみないとダメな様です。
RDS for Oracle のブロックサイズ
続けてRDSインスタンスを作成、接続してインスタンスに対してV$PARAMETER
の値を確認してみました。
-- V$PARAMETER からパラメーター値を取得
SELECT NAME, VALUE, ISDEFAULT
FROM V$PARAMETER
WHERE NAME = 'db_block_size'
結果は下図の通り、DB_BLOCK_SIZE = 8K
でOracle Databaseのデフォルト設定をそのまま使用してました。
RDS for Oracleのエディションやバージョン、インスタンスタイプによってAWSが設定を変えてくる可能性は否定できませんが、ひとまずはDB_BLOCK_SIZE = 8K
と考えて問題ないでしょう。
厳密に正確な結果が必要なる場合は実際のスペックで環境を用意して本記事の様に直接確認してください。
RDS for Oracle で非標準ブロックサイズを試してみる
あと、せっかくなので非標準ブロックサイズを設定できるか試してみました。
今回は事前にDB_16K_CACHE_SIZE
を設定しブロックサイズ16KB
の表領域を作ってみます。
-- ブロックサイズ 16KB の表領域 MY_16K_TBS を作成
-- ※ 事前に DB_16K_CACHE_SIZE パラメーターを設定してください
CREATE TABLESPACE MY_16K_TBS DATAFILE SIZE 10M AUTOEXTEND ON MAXSIZE 100M BLOCKSIZE 16K
-- 作成後表領域情報を確認
SELECT TABLESPACE_NAME, CONTENTS, BIGFILE, BLOCK_SIZE
FROM DBA_TABLESPACES
サクッとブロックサイズ16KB
の表領域を作れました。
他の表領域が8KB
なのも併せて見て取れますね。
非標準ブロックサイズはOracleの標準機能なので利用に際し何も問題無いはずですが、AWSのドキュメントには全然説明が無かったのでサポート状況が気になる方は事前にAWSに問い合わせると良いでしょう。
補足 : RDS for Oracleの最大ファイルサイズ
最後に補足を一点だけ。
ブロックサイズは各データベースファイルの最大サイズに影響を及ぼし、例えばbigfile表領域の場合1ファイルあたり2の32乗ブロックが最大サイズになります。
このため8KBブロックの場合だと最大32TBとなります。
ただしAWSのドキュメントによれば、
The maximum size of a single file on Amazon RDS Oracle DB instances is 16 TiB (tebibytes).
とされており若干少ない値になっています。
こちらについては、確定した根拠は無く予想となりますが、Oracleでなくファイルシステムの制限だと思います。
なお、RDS for Oracle全体のストレージサイズに関しては本日時点で最大64TBです。
最後に
簡単ですが以上となります。
正直なところ最近はOracleに限らずRDBMSのブロックサイズを気にすることがめっきり減ってしまいました。
改めてこういった基本的な仕様を確認するのも大事だなと思った次第です。